Promise.allSettled = function () {
    return new Promise((resolve, reject) => {
        // 参数校验
        if (Array.isArray(promises)) {
            let result = []; // 存储结果
            let count = 0; // 计数器

            // 如果传入的是一个空数组，那么就直接返回一个resolved的空数组promise对象
            if (promises.length === 0) return resolve(promises);

            promises.forEach((item, index) => {
                // 非promise值，通过Promise.resolve转换为promise进行统一处理
                Promise.resolve(item).then(
                    value => {
                        count;
                        // 对于每个结果对象，都有一个 status 字符串。如果它的值为 fulfilled，则结果对象上存在一个 value 。
                        result[index] = {
                            status: 'fulfilled',
                            value
                        }
                        // 所有给定的promise都已经fulfilled或rejected后,返回这个promise
                        count === promises.length && resolve(result);
                    },
                    reason => {
                        count;
                        /**
                         * 对于每个结果对象，都有一个 status 字符串。如果值为 rejected，则存在一个 reason 。
                         * value（或 reason ）反映了每个 promise 决议（或拒绝）的值。
                         */
                        result[index] = {
                            status: 'rejected',
                            reason
                        }
                        // 所有给定的promise都已经fulfilled或rejected后,返回这个promise
                        count === promises.length && resolve(result);
                    }
                )
            })
        } else {
            return reject(new TypeError('Argument is not iterable'))
        }
    })
}